1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 package net.sf.deadbolt.handlers;
51
52
53
54 import java.util.*;
55
56 import javax.servlet.http.HttpServletRequest;
57 import javax.servlet.http.HttpServletResponse;
58
59 import net.sf.deadbolt.model.Room;
60
61 import org.apache.log4j.Logger;
62
63 /***
64 * This class will secure a Room from SQL injection attacks.
65 *
66 * @author Tim Solley <timsolley@yahoo.com>
67 */
68 public class SQLInjectionHandler extends DeadboltHandler {
69 private static Logger logger = Logger.getLogger(SQLInjectionHandler.class.getName());
70
71 /***
72 * These are all the keywords that this handler will check for
73 */
74 private String[] badStringsWeak = new String[] {"'", ";", "--"};
75
76 private String[] badStringsStrong = new String[] {"'", ";", "--", "union", "drop", "insert",
77 "update", "delete", "having", "group by", "select", "sum", "max", "min",
78 "values", "@@", "from", "where", "create", "begin", "declare", "end",
79 "exec", "shutdown", "xp_", "master", "bulk insert"};
80 private String[] badStrings;
81
82 private List excludedFields;
83
84 /***
85 * This method runs through the parameters in the request and checks them
86 * for the keywords that are not allowed.
87 */
88 public boolean authenticate(HttpServletRequest request,
89 HttpServletResponse response, Room room) {
90 logger.debug("ENTERING: authenticate");
91
92 boolean result = true;
93
94
95
96
97
98
99
100 if("WEAK".equals(room.getInitParam("LEVEL"))) {
101 badStrings = badStringsWeak;
102 } else {
103 badStrings = badStringsStrong;
104 }
105
106
107 String excludedFieldsParam = room.getInitParam("EXCLUDED-FIELDS");
108 logger.debug("The following fields will be excluded from this handler: " + excludedFieldsParam);
109 if(excludedFieldsParam != null) {
110 String[] excludedFieldsArray = excludedFieldsParam.split(",");
111 for(int i = 0; i < excludedFieldsArray.length; i++) {
112 excludedFieldsArray[i] = excludedFieldsArray[i].trim();
113 }
114 excludedFields = Arrays.asList(excludedFieldsArray);
115 }
116 else
117 excludedFields = new ArrayList(0);
118
119 for(Enumeration parameterEnumeration = request.getParameterNames();
120 parameterEnumeration.hasMoreElements();) {
121 String element = (String) parameterEnumeration.nextElement();
122 if(!excludedFields.contains(element)) {
123 logger.debug("The following parameter is being tested: " + element);
124 result = testValue(request.getParameter(element), request, room);
125 }
126
127 if(!result) {
128 break;
129 }
130 }
131
132 logger.debug("EXITING: authenticate");
133 return result;
134 }
135
136 /***
137 * This method scans the parameter value sent in, checking for the
138 * prohibited strings.
139 *
140 * @param value
141 * @param request
142 * @param room
143 * @return
144 */
145 private boolean testValue(String value, HttpServletRequest request, Room room) {
146 logger.debug("ENTERING: testValue");
147 boolean result = true;
148
149
150 for(int key = 0; key < badStrings.length; key++) {
151 logger.debug("Testing value = " + value + " and badString = " + badStrings[key]);
152 if(value.matches(badStrings[key])) {
153 logger.debug("A forbidden string was found: " + value);
154 addErrorMessage(request, (String) room.getInitParam("ErrorMessage"));
155 logger.debug("The value was rejected, returning false");
156 result = false;
157 break;
158 }
159 }
160
161 logger.debug("EXITING: testValue");
162 return result;
163 }
164
165 }